/**
 * @author your name (you@domain.com)
 * @brief
 * @version 0.1
 * @date 2023-12-23
 *
 * @copyright Copyright (c) 2023
 * 聊天协议类型定义
 */
#pragma once
#include <cstdint>
#include <cstddef>
#include <vector>

typedef uint32_t userid_t;
typedef uint32_t groupid_t;
typedef char name_t[32];

enum msg_type
{
    msg_type_unknown,
    msg_type_heartbeat = 1000,      // 心跳包
    msg_type_register,              // 注册
    msg_type_login,                 // 登陆
    msg_type_getofriendlist,        // 获取好友列表
    msg_type_finduser,              // 查找用户
    msg_type_operatefriend,         // 添加、删除等好友操作
    msg_type_userstatuschange,      // 用户信息改变通知
    msg_type_updateuserinfo,        // 更新用户信息
    msg_type_modifypassword,        // 修改登陆密码
    msg_type_creategroup,           // 创建群组
    msg_type_getgroupmembers,       // 获取群组成员列表
    msg_type_chat = 1100,           // 单聊消息
    msg_type_multichat,             // 群发消息
    msg_type_kickuser,              // 被踢下线
    msg_type_updateteaminfo,        // 更新用户好友分组信息
    msg_type_modifyfriendmarkname,  // 更新好友备注信息
    msg_type_movefriendtootherteam, // 移动好友至
};

enum online_type
{
    online_type_offline,   // 离线
    online_type_online,    // 在线
    online_type_invisible, // 隐身
    // online_type_pc = 1, // PC端
    // online_type_mac = 2 // MAC在线
};

enum operate_type
{
    operate_type_add,    // 添加
    operate_type_delete, // 删除
};

// 客户端发送至服务端
namespace msg_c_s
{
    // 注册
    struct registet
    {
        name_t username;
        name_t password;
        name_t nickname;
    };
    // 登陆
    struct login
    {
        name_t username;
        name_t password;
    };
    struct friendlist
    {
        userid_t userid;
    };
    struct finduser
    {
        name_t username;
    };
    struct operatefriend
    {
        userid_t friendid;
        operate_type operatetype;
    };
    struct userstatuschange
    {
        userid_t userid;
        online_type status;
    };

}

// 服务端发送至客户端
namespace msg_s_c
{
    struct registet
    {
        int result;
    };

    struct login
    {
        int result;
        char token[36];
    };

    struct login_user_ifo
    {
        userid_t uid;
        name_t nickname;
        online_type status;
    };

    struct friend_info
    {
        userid_t uid;
        name_t nickname;
        name_t markname; // 备注名
        online_type status;
        uint8_t teamid;
    };
    struct friendlist
    {
        std::vector<std::pair<u_int8_t, name_t>> team_names;
        std::vector<friend_info> friends;
    };
    struct finduser
    {
        userid_t uid;
        name_t nickname;
        uint8_t status;
    };
    struct operatefriend
    {
        int result;
    };
    struct chat
    {
        userid_t uid; // 发送者id
        std::string msg;
    };
}